Python | @classmethod @staticmethod区别
Python中有三种方式定义类方法:
- 常规方法;
- @classmethod修饰方法;
- @staticmathod修饰方式。
执行:
输出:
1. 定义方式
普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。@classmethod修饰的方法class_foo()需要通过cls参数传递当前的类对象。@staticmethod修饰的方法定义与普通函数是一样的。
self和cls的区别不是强制的,只是PEP8中一种编程风格,self通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。
2. 绑定对象
# foo方法绑定对象A的实例,class_foo方法绑定对象A,static_foo没有参数绑定
>>> print(a.foo)
输出:
>>> print(a.class_foo)
<bound method A.class_foo of <class '__main__.A'>>
>>> print(a.static_foo)
<function A.static_foo at 0x000001A1026F5840>
3. 调用方式
foo可通过实例a调用,类对象A直接调用会参数错误。
>>> a.foo(l)
输出:
A.foo(1)
输出:
但foo如下方式可以使用正常,显式的传递实例参数a。
A.foo(a, 1)
输出:
class_foo通过类对象或对象实例调用。
>>> A.class_foo(1)
输出:
>>> a.class_foo(1)
输出: